#include "log.h"
#include "tcp/tcp.h"
#include "ipc/Ftok.h"
#include "ipc/Shm.h"
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

    if(argc < 2){
	log("%s <puerto>\n", argv[0]);
	exit(-1);
    }

    int puerto = atoi(argv[1]);
    if(puerto <= 0){
	log("El puerto no puede ser %d\n", puerto);
	exit(-1);
    }

    int sockfd = tcpoppas(puerto);
    if(sockfd <= 0){
	perror("no se pudo abrir el socket");
	exit(-2);
    }

    std::string path;
    path = ftok_crear_archivo("Tickets");
    if(path.size()==0){
	log("Error, no se pudo obtener el path para FTOK.\n");
	exit(-1);
    }
    Ticketera ticketera(path.c_str(),1);
    ticketera.reset();
    ticketera.siguiente(); //salteo el 0
    int aceptado=0;
    while((aceptado = aceptar(sockfd)) > 0){
	long id_conexion=ticketera.siguiente();

	clog(AMARILLO, "Nueva conexion aceptada.\n");
	if(fork() == 0){
	    close(sockfd);
	    char socket[20];
	    sprintf(socket, "%d", aceptado);
	    char conexion[20];
	    sprintf(conexion, "%ld", id_conexion);

	    execlp("./proxy-client", "./proxy-client", socket, conexion, NULL);
	    perror("Error en el exec del proxy client.\n");
	    exit(-1);
	}
	if(fork() == 0){
	    close(sockfd);
	    char socket[20];
	    sprintf(socket, "%d", aceptado);
	    char conexion[20];
	    sprintf(conexion, "%ld", id_conexion);

	    execlp("./proxy-receiver", "./proxy-receiver", socket, conexion, NULL);
	    perror("Error en el exec del proxy receiver.\n");
	    exit(-1);
	}

	close(aceptado);
    }

    return 0;
}
